/* 
 * File:   Dictionary.h
 * Author: igui
 *
 * Created on 29 de mayo de 2011, 02:26 AM
 */

#ifndef DICTIONARY_H
#define	DICTIONARY_H

#include "../interfacesCol/ICollectible.h"
#include "../interfacesCol/IKey.h"
#include "../interfacesCol/IIterator.h"
#include "../interfacesCol/IDictionary.h"
#include "HashTable.h"

/**
 * Implementación de IDictionary que toma claves HashedKey. Si se proveen
 * otras claves se lanza invalid_argument
 */
class Dictionary: public IDictionary
{
private:
    HashTable table;
public:
    /**
     * Agrega un valor al diccionario
     * @param k la clave, debe ser un objeto creado con new y no se puede reusar.
     *          Se borra al destruir el diccionario
     * @param val el valor a almacenar. No se borra 
     */    
    void add(IKey *k, ICollectible *val);
    
    /**
     * Devuelve true si hay un miembro con cierta clave
     * @param k la clave
     */
    bool member(IKey *k);
    
    /**
     * Saca el miembro del diccionario
     * @param k la clave a buscar
     */
    void remove(IKey *k);
    
    /**
     * Busca un elemento en el diccionario
     * @param k la clave a buscar
     * @return el ICollectible que se agregó con add o NULL si no hay tal objeto
     */
    ICollectible *find(IKey *k);
    
    /**
     * 
     * @return true si el tamaño es 0
     */
    bool isEmpty();
    
    /**
     * Devuelve el tamaño del diccionario
     * @return 
     */
    int getSize();
    
    /**
     * Obtiene un iterador en los elementos del diccionario
     * @return un iterador creado con new
     */
    IIterator *getIterator();
};

#endif	/* DICTIONARY_H */

